package com.xygz.orm;

import com.xygz.orm.exception.ORMException;

import java.sql.SQLException;
import java.util.*;

/**
 * 标准SQL调用，支持(executeUpdate, executeBatch, executeQuery)<br><br>
 * executeUpdate,       执行更新SQL语句，支持insert,replace,update,delete等<br>
 * executeBatch,        批量执行更新SQL语句，支持insert,replace,update,delete等<br>
 * executeQuery,        执行查询SQL语句，<br>
 * 返回结果可以是boolean,byte,short,int,long,String,Timestamp,double,byte[]等9种类型<br>
 *
 * @author xiyuan-lgz 2023-11-04 @version v1.0.0 新建与整理
 */
@SuppressWarnings("all")
public interface SQL {
    
    // /**
    //  * 查询当前自增ID值
    //  *
    //  * @return              整型
    //  * @throws SQLException 数据库异常
    //  */
    // public int identityInt() throws SQLException;
    //
    // /**
    //  * 查询当前自增ID值
    //  *
    //  * @return              长整型
    //  * @throws SQLException 数据库异常
    //  */
    // public long identityLong() throws SQLException;
    //
    //
    // /************************************************************************************************/
    // //execute
    // /************************************************************************************************/
    //
    // /**
    //  * 执行标准SQL语句，不带参数，如DDL,DML语句
    //  *
    //  * @param sql           SQL语句
    //  * @throws SQLException 数据库异常
    //  */
    // public void execute(String sql) throws SQLException;
    //
    // /**
    //  * 批执行标准SQL语句，不带参数，如DDL,DML语句
    //  *
    //  * @param sqlList       SQL语句列表
    //  * @throws SQLException 数据库异常
    //  */
    // public void execute(List<String> sqlList) throws SQLException;
    //
    /************************************************************************************************/
    //executeUpdate
    /************************************************************************************************/
    
    /**
     * executeUpdate执行
     *
     * @param sql SQL语句
     * @param replaceMap 可替换表
     * @return int          执行条数
     * @throws ORMException 映射异常
     * @throws SQLException 数据库异常
     */
    public int executeUpdate(String sql, Collection<Object> params, Map<String, String> replaceMap) throws SQLException, ORMException;
    
    //
    // /**
    //  * executeUpdate执行
    //  *
    //  * @param sql           SQL语句
    //  * @return int          受影响行数
    //  * @throws ORMException 映射异常
    //  * @throws SQLException 数据库异常
    //  */
    // public int executeUpdate(String sql) throws ORMException, SQLException;
    //
    // /**
    //  * executeUpdate执行
    //  *
    //  * @param sql           SQL语句
    //  * @param param         参数,需和update配置对应，否则将报错
    //  * @param params        参数,需和update配置对应，否则将报错
    //  * @return int          受影响行数
    //  * @throws ORMException 映射异常
    //  * @throws SQLException 数据库异常
    //  */
    // public int executeUpdate(String sql, Object param, Object...params) throws ORMException, SQLException;
    //
    //
    // /************************************************************************************************/
    // //executeBatch
    // /************************************************************************************************/
    // /**
    //  * executeBatch执行
    //  *
    //  * @param sql           SQL语句
    //  * @param paramList     参数列表
    //  * @return              int[] 执行结果数组
    //  * @throws ORMException 映射异常
    //  * @throws SQLException 数据库异常
    //  */
    // public int[] executeBatch(String sql, List<?> paramList) throws ORMException, SQLException;
    //
    //
    /************************************************************************************************/
    // executeQuery
    /************************************************************************************************/
    
    /**
     * 执行executeQuery处理
     *
     * @param clz              查询表
     * @param sql              SQL语句
     * @param params           参数
     * @param replaceMap       替换参数表
     * @param <T>              查询表类型
     * @return                 查询结果
     * @throws SQLException    异常信息
     * @throws ORMException    异常信息
     */
    public <T> List<T> executeQuery(Class<T> clz, String sql, Collection<Object> params, Map<String, String> replaceMap) throws SQLException, ORMException;
    
    /**
     * 执行executeQuery处理
     *
     * @param clz              查询表
     * @param sql              SQL语句
     * @param params           参数
     * @param replaceMap       替换参数表
     * @param <T>              查询表类型
     * @return                 查询结果
     * @throws SQLException    异常信息
     * @throws ORMException    异常信息
     */
    default  <T> List<T> executeQuery(Class<T> clz, String sql, Map<String, String> replaceMap) throws SQLException, ORMException{
        return executeQuery(clz, sql, null, replaceMap);
    };
    
    /**
     * 执行executeQuery处理
     *
     * @param clz              查询表
     * @param sql              SQL语句
     * @param params           参数
     * @param replaceMap       替换参数表
     * @param <T>              查询表类型
     * @return                 查询结果
     * @throws SQLException    异常信息
     * @throws ORMException    异常信息
     */
    default  <T> List<T> executeQuery(Class<T> clz, String sql, Collection<Object> params) throws SQLException, ORMException{
        return executeQuery(clz, sql, params, null);
    };
    /**
     * 执行executeQuery处理
     *
     * @param clz              查询表
     * @param sql              SQL语句
     * @param params           参数
     * @param replaceMap       替换参数表
     * @param <T>              查询表类型
     * @return                 查询结果
     * @throws SQLException    异常信息
     * @throws SQLException    异常信息
     */
    default  <T> List<T> executeQuery(Class<T> clz, String sql) throws SQLException, ORMException{
        return executeQuery(clz, sql, null, null);
    };
    
    /**
     * 执行executeQuery处理
     *
     * @param clz              查询表
     * @param sql              SQL语句
     * @param params           参数
     * @param <T>              查询表类型
     * @return                 查询结果
     * @throws SQLException    异常信息
     * @throws SQLException    异常信息
     */
    public  <T> List<T> executeQuery(Class<T> clz, String sql, Object...params) throws SQLException, ORMException;
    
    /**
     * executeQuery执行
     *
     * @param sql              SQL语句
     * @param params           参数列表
     * @param replaceMap       替换参数表
     * @return                 结果集
     * @throws SQLException    异常信息
     * @throws SQLException    异常信息
     */
    public List<Map<String, Object>> executeQuery(String sql, Collection<Object> params, Map<String, String> replaceMap) throws ORMException, SQLException;
    
    /**
     * executeQuery执行
     *
     * @param sql              SQL语句
     * @param params           参数列表
     * @param replaceMap       替换参数表
     * @return                 结果集
     * @throws SQLException    异常信息
     * @throws SQLException    异常信息
     */
    default List<Map<String, Object>> executeQuery(String sql, Map<String, String> replaceMap) throws ORMException, SQLException{
        return executeQuery(sql, null, replaceMap);
    }
    
    /**
     * executeQuery执行
     *
     * @param sql              SQL语句
     * @param params           参数列表
     * @param replaceMap       替换参数表
     * @return                 结果集
     * @throws SQLException    异常信息
     * @throws SQLException    异常信息
     */
    default List<Map<String, Object>> executeQuery(String sql, Collection<Object> params) throws ORMException, SQLException{
        return executeQuery(sql, params, (Map<String, String>) null);
    }
    
    

    /**
     * executeQuery执行
     *
     * @param sql           SQL语句
     * @return              结果集
     * @throws SQLException    异常信息
     * @throws SQLException    异常信息
     */
     default List<Map<String, Object>> executeQuery(String sql) throws ORMException, SQLException{
         return executeQuery(sql, (Collection<Object>) null, (Map<String, String>) null);
     }
    
    /**
     * executeQuery执行
     *
     * @param sql           SQL语句
     * @param params           参数列表
     * @return              结果集
     * @throws SQLException    异常信息
     * @throws SQLException    异常信息
     */
    public List<Map<String, Object>> executeQuery(String sql, Object ...params) throws SQLException, ORMException;
}
